package main

import "fmt"

// Config 策略配置
type Config struct {
	// ETF池配置
	ETFCodes       []string // 参与策略计算的ETF
	BenchmarkCodes []string // 仅用于基准对比的ETF（不参与策略计算）

	// 数据配置
	StartDate string // 开始日期 YYYYMMDD
	EndDate   string // 结束日期 YYYYMMDD

	// 回测配置
	RebalanceMode  string  // 调仓模式: "weekly"=周线模式, "daily"=日线模式
	InitialCapital float64 // 初始资金
	MonthlyInvest  float64 // 每月定投金额（0表示不定投）

	// 策略参数
	ShortPeriod int     // 短期动量周期（周）
	LongPeriod  int     // 长期动量周期（周）
	MinReturn   float64 // 最小收益率阈值（低于此值则空仓）

	// 仓位配置
	SingleETFWeight float64 // 单个ETF权重（当两个周期选中同一个）
	DualETFWeight   float64 // 双ETF各自权重（当两个周期选中不同的）

	// 输出文件配置
	DataFile   string // 数据文件名
	ResultFile string // 结果文件名
	ChartFile  string // 图表文件名
}

// DefaultConfig 返回默认配置
func DefaultConfig() *Config {
	return &Config{
		// ETF池：参与策略计算的ETF
		ETFCodes: []string{
			"518880", // 黄金
			"159941", // 纳指
			"588050", // 科创50
			"159915", // 创业板
			// "510300", // 沪深300
			// "511010", // 国债
		},

		// 基准ETF：仅用于对比，不参与策略计算
		BenchmarkCodes: []string{
			"510300", // 沪深300（作为基准）
		},

		// 数据时间范围
		StartDate: "20160101",
		EndDate:   "20251008",

		// 调仓模式
		RebalanceMode: "weekly", // "weekly" 或 "daily"

		// 初始资金
		InitialCapital: 100000,
		MonthlyInvest:  0000, // 每月定投金额（0表示不定投）

		// 策略参数
		ShortPeriod: 3,    // 近3周
		LongPeriod:  4,    // 近4周
		MinReturn:   0.00, // 涨幅必须大于0，否则空仓

		// 仓位配置
		SingleETFWeight: 1.0, // 同一个标的100%
		DualETFWeight:   0.5, // 不同标的各50%

		// 输出文件
		DataFile:   "etf_data.xlsx",
		ResultFile: "backtest_results.xlsx",
		ChartFile:  "equity_curve.html",
	}
}

// CustomConfig 自定义配置示例
func CustomConfig() *Config {
	config := DefaultConfig()

	// 可以在这里修改配置
	// 例如：
	// config.ETFCodes = []string{"510300", "159941"} // 只用2个ETF
	// config.ShortPeriod = 2  // 改为2周
	// config.LongPeriod = 5   // 改为5周
	// config.InitialCapital = 500000 // 50万初始资金

	return config
}

// PrintConfig 打印配置信息
func (c *Config) PrintConfig() {
	fmt.Println("\n" + repeatStr("=", 60))
	fmt.Println("策略配置参数")
	fmt.Println(repeatStr("=", 60))
	fmt.Println("ETF池:")
	for _, code := range c.ETFCodes {
		fmt.Println("  - " + code)
	}
	fmt.Println("")
	fmt.Printf("数据时间范围: %s 至 %s\n", c.StartDate, c.EndDate)
	fmt.Printf("调仓模式: %s\n", c.RebalanceMode)
	fmt.Printf("初始资金: ¥%.2f\n", c.InitialCapital)
	fmt.Println("")
	fmt.Printf("短期动量周期: %d周\n", c.ShortPeriod)
	fmt.Printf("长期动量周期: %d周\n", c.LongPeriod)
	fmt.Printf("最小收益率阈值: %.2f%% (低于此值空仓)\n", c.MinReturn*100)
	fmt.Println("")
	fmt.Printf("单标的权重: %.0f%%\n", c.SingleETFWeight*100)
	fmt.Printf("双标的各自权重: %.0f%%\n", c.DualETFWeight*100)
	fmt.Println(repeatStr("=", 60))
}
